#第十二章 继承的优缺点

#当想自定义一个list等相关的集合类时 应该继承UserDict、UserList 和UserString这些 因为内置的会忽略自定义覆盖的方法

#例如:
class DoppeDict(dict):
    def __setitem__(self,key,value):
        super().__setitem__(key,[value]*2)

dd = DoppeDict(one=1) #这个不会 因为内置类dict的__init__方法会忽略子类自定义的方法
print(dd)
dd['age'] = 23 #这个会正常执行自定义的__setitem__
print(dd)
dd.update(one=20) # update 依然不会执行子类自定义的__setitem__方法
print(dd)

#如果继承UserDict就可以解决该问题

from collections import UserDict

class DoppeDict2(UserDict):
    def __setitem__(self,key,value):
        super().__setitem__(key,[value]*2)
dd2 = DoppeDict2(one=2)
print(dd2) #会预期那样输出 {'one': [2, 2]}

#多继承，多继承中调用父类同名方法的顺序

class A():
    def pong(self):
        print("pong A",self)
class B():
    def pong(self):
        print('PONG B',self)
    
class C(B,A):
    def pong(self):
        super().pong() #按照顺序调用方法 
        #A.pong(self) #显式调用父类的方法

    def ping(self):
        print("ping")
    def pingpong(self):
        print("pingpong")

c = C()
c.pong() #调用的是父类B的方法 调用顺序的按照__mro__表顺序调用的 也就是按照继承输入的顺序左到右


